package com.kurumi.medical.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class FtpClientUtil {
	private static final Logger log = LoggerFactory.getLogger(FtpClientUtil.class);
	
	/** 
	 * Description: 向FTP服务器上传文件 
	 * @Version1.0 Jul 27, 2008 4:31:09 PM by 崔红保（cuihongbao@d-heaven.com）创建 
	 * @param url FTP服务器hostname 
	 * @param port FTP服务器端口 
	 * @param username FTP登录账号 
	 * @param password FTP登录密码 
	 * @param path FTP服务器保存目录 
	 * @param filename 上传到FTP服务器上的文件名 
	 * @param input 输入流 
	 * @return 成功返回true，否则返回false 
	 */  
	public static boolean uploadFile(String url,int port,String username, String password, String path, String filename, InputStream input) {  
	    boolean success = false;  
	    FTPClient ftp = new FTPClient();  
	    try {  
	        int reply;  
	        ftp.enterLocalPassiveMode();
	        ftp.connect(url, port);//连接FTP服务器  
	        //如果采用默认端口，可以使用ftp.connect(url)的方式直接连接FTP服务器  
	        ftp.login(username, password);//登录  
	        reply = ftp.getReplyCode();  
	        if (!FTPReply.isPositiveCompletion(reply)) {  
	            ftp.disconnect();  
	            return success;  
	        }  
	        ftp.changeWorkingDirectory(path);  
	        ftp.storeFile(filename, input);           
	          
	        input.close();  
	        ftp.logout();  
	        success = true;  
	    } catch (IOException e) {  
	        e.printStackTrace();  
	    } finally {  
	        if (ftp.isConnected()) {  
	            try {  
	                ftp.disconnect();  
	            } catch (IOException ioe) {  
	            }  
	        }  
	    }  
	    return success;  
	}
	
	/** 
	 * Description: 从FTP服务器下载文件 
	 * @Version1.0 Jul 27, 2008 5:32:36 PM by 崔红保（cuihongbao@d-heaven.com）创建 
	 * @param url FTP服务器hostname 
	 * @param port FTP服务器端口 
	 * @param username FTP登录账号 
	 * @param password FTP登录密码 
	 * @param remotePath FTP服务器上的相对路径 
	 * @param fileName 要下载的文件名 
	 * @param localPath 下载后保存到本地的路径 
	 * @return 
	 */  
	public static boolean downFile(String url, int port,String username, String password, String remotePath,String fileName,String localPath) {  
	    boolean success = false;  
	    FTPClient ftp = new FTPClient();  
	    try {  
	        int reply;  
	        ftp.enterLocalPassiveMode();
	        ftp.connect(url, port);  
	        //如果采用默认端口，可以使用ftp.connect(url)的方式直接连接FTP服务器  
	        ftp.login(username, password);//登录  
	        reply = ftp.getReplyCode();  
	        
	        if (!FTPReply.isPositiveCompletion(reply)) {  
	            ftp.disconnect();  
	            return success;  
	        }  
	        
	        boolean isChange = ftp.changeWorkingDirectory(remotePath);//转移到FTP服务器目录  
	        
	        if (isChange) {
	            FTPFile[] fs = ftp.listFiles();  
		        for(FTPFile ff:fs){  
		            if(ff.getName().equals(fileName)){  
		                File localFile = new File(localPath+"/"+ff.getName());  
		                  
		                OutputStream is = new FileOutputStream(localFile);   
		                ftp.retrieveFile(ff.getName(), is);  
		                is.close();  
		            }  
		        }  
	        }
	          
	        ftp.logout();  
	        success = true;  
	    } catch (IOException e) {  
	        e.printStackTrace();  
	        success = false;
	    } finally {  
	        if (ftp.isConnected()) {  
	            try {  
	                ftp.disconnect();  
	            } catch (IOException ioe) {  
	            }  
	        }  
	    }  
	    return success;  
	}
	
	/** 
	 * Description: 从FTP服务器下载文件 
	 * @Version1.0 Jul 27, 2008 5:32:36 PM by 崔红保（cuihongbao@d-heaven.com）创建 
	 * @param url FTP服务器hostname 
	 * @param port FTP服务器端口 
	 * @param username FTP登录账号 
	 * @param password FTP登录密码 
	 * @param remotePath FTP服务器上的相对路径 
	 * @param fileName 要下载的文件名 
	 * @param localPath 下载后保存到本地的路径 
	 * @return 
	 */  
	public static List<String> downFile(String url, int port,String username, String password, String remotePath,String localPath) {  
	    List<String> fileList = new ArrayList<>();
	    FTPClient ftp = new FTPClient();  
	    try {  
	        int reply; 
	        ftp.enterLocalPassiveMode();
	        ftp.connect(url, port);  
	        //如果采用默认端口，可以使用ftp.connect(url)的方式直接连接FTP服务器  
	        ftp.login(username, password);//登录  
	        reply = ftp.getReplyCode();  
	        if (!FTPReply.isPositiveCompletion(reply)) {  
	            ftp.disconnect();  
	            return null;  
	            
	        }  
	        
	        ///MEDDOC/00/0B/28/41/77/IP_1/ remotePath
	        boolean isChange = ftp.changeWorkingDirectory(remotePath);//转移到FTP服务器目录
	        System.out.println(remotePath+"----------"+isChange);
	        log.info("-------定位到ftp下载的目录为---------" +remotePath+"----目录是否存在----" + isChange);
	        
	        if (isChange) {
	            FTPFile[] fs = ftp.listFiles();  
	            
		        for(FTPFile ff:fs){  
		        		log.info("-------ftp开始下载------" + remotePath + ff.getName());
		                File localFile = new File(localPath+"/"+ff.getName());  
		                  
		                OutputStream is = new FileOutputStream(localFile);   
		                ftp.retrieveFile(ff.getName(), is);  
		                fileList.add(ff.getName());
		                is.close();  
		                log.info("---------ftp下载结束------------");
		        }  
	        }
	        
	        ftp.logout();  
	    } catch (IOException e) {  
	        e.printStackTrace();  
	    } finally {  
	        if (ftp.isConnected()) {  
	            try {  
	                ftp.disconnect();  
	            } catch (IOException ioe) {  
	            
	            }  
	        }  
	    }  
	    return fileList;  
	}
	
	/**
	 * 下载病程记录
	 * 
	 * @param url
	 * @param port
	 * @param username
	 * @param password
	 * @param remotePath ftp服务器上病程记录的路径
	 * @param localPath	 本地存储病程记录的路径
	 * @return
	 */
	public static Result downProgressNoteFile(String url, int port,String username, String password, String remotePath,String localPath) {  
	    List<String> fileList = new ArrayList<String>();
	    FTPClient ftp = new FTPClient();
	    
	    try {  
	        int reply; 
	        ftp.enterLocalPassiveMode();
	        
	        try {
	        	ftp.connect(url, port);  
			} catch (java.net.ConnectException e) {
				e.printStackTrace();
				log.error("-------从下载病程记录html文件连接不上ftp服务器-------" + ExceptionUtil.getStackTrace(e));
				return new Result(false, "FTP服务器已经宕机了" + ExceptionUtil.getStackTrace(e), null, 404);
			}
	       
	        if (!ftp.login(username, password)) {
	        	log.error("FTP登陆失败，请检测登陆用户名和密码是否正确");
	        	return new Result(false, "FTP登陆失败，请检测登陆用户名和密码是否正确", null, -1);  
	        }
	        
	        reply = ftp.getReplyCode();
	        
	        if (!FTPReply.isPositiveCompletion(reply)) {
	            log.error("----ftp服务器 可能主动模式或者被动模式导致-----当前的reply=" + reply);
	            return new Result(false, "下载病程记录html ftp服务器 可能主动模式或者被动模式导致,当前的reply=" + reply, null, -2);  
	        }  
	        
	        ///MEDDOC/00/0B/28/41/77/IP_1/ remotePath
	        boolean isChange = ftp.changeWorkingDirectory(remotePath);//转移到FTP服务器目录
	        
	        if (!isChange) {
	        	log.error("ftp上目录不存在");
	        	return new Result(false, "ftp服务器上资源不存在", null, -3);
	        }
	        
	        FTPFile[] fs = ftp.listFiles();
	        
	        try {
	        	for(FTPFile ff : fs){
	        		   OutputStream is = null;
	        		   
	        		   try {
	        			   log.info("-------ftp开始下载------" + remotePath + ff.getName());
				           File localFile = new File(localPath+"/"+ff.getName());  
				           is = new FileOutputStream(localFile);   
				           ftp.retrieveFile(ff.getName(), is);  
				           fileList.add(ff.getName());
				          log.info("---------ftp下载结束------------");
						} catch (Exception e) {
							log.error("---从ftp下载文件到本地异常-----" + ExceptionUtil.getStackTrace(e));
							return new Result(false, "从ftp下载文件到本地异常" + ExceptionUtil.getStackTrace(e), null, -4);
						} finally {
							IOUtils.closeQuietly(is);
					}
			    }  
			} catch (Exception e) {
				log.error("---从ftp下载文件到本地异常-----" + ExceptionUtil.getStackTrace(e));
				return new Result(false, "从ftp下载文件到本地异常" + ExceptionUtil.getStackTrace(e), null, -4);
			} 
	        
	        return new Result(true, "成功", fileList, 200);
	    } catch (Exception e) {  
	        e.printStackTrace();
	        return new Result(false, "ftp服务异常" + ExceptionUtil.getStackTrace(e), null, 500);
	    } finally {  
	    	closeServer(ftp); 
	    }  
	}
	
	/** 
	  * 关闭FTP服务器 
	  */  
	 private static void closeServer(FTPClient ftpClient){  
	  try{  
	   if(ftpClient!=null){  
	    ftpClient.logout();  
	    ftpClient.disconnect();  
	   }  
	  }catch(IOException e){  
	   e.printStackTrace();  
	  }  
	 }  
	
	/*public static void main(String[] args) {
		String mrId = "D302634";
		Integer visitNumber = 1;
		
		String url = "192.168.21.85";
		int port = 21;
		String username = "h2oco2";
		String password = "h2oco2";
		String remotePath = StringUtil.ftpFolderGenerator(mrId, visitNumber);
		log.debug("remotePath=" + remotePath);
		String localPath = "D:\\publics\\progressNote\\html_test\\32f02d32696544cc853f33bc7f7f80bc";
		
		if (!new File(localPath).isDirectory()) {
			new File(localPath).mkdirs();
		}
		
		downProgressNoteFile(url, port, username, password, remotePath, localPath);
	}*/
	
	
}






